package model

import (
	"time"
)

// ChatSession 客服会话表
type ChatSession struct {
	ID               uint       `gorm:"primaryKey" json:"id"`
	MemberID         uint       `gorm:"not null;index:idx_member_id" json:"memberId"`                                                     // 会员ID
	StaffID          *uint      `gorm:"index:idx_staff_id" json:"staffId"`                                                                // 客服/教练ID（为空表示未分配）
	Type             string     `gorm:"type:enum('CUSTOMER_SERVICE','COACH_CONSULT');not null;default:'CUSTOMER_SERVICE'" json:"type"`    // 会话类型
	Status           string     `gorm:"type:enum('WAITING','ACTIVE','CLOSED');not null;default:'WAITING';index:idx_status" json:"status"` // 会话状态
	Title            string     `gorm:"size:200" json:"title"`                                                                            // 会话标题
	LastMessageID    *uint      `json:"lastMessageId"`                                                                                    // 最后一条消息ID
	LastMessageAt    *time.Time `json:"lastMessageAt"`                                                                                    // 最后消息时间
	UnreadCount      int        `gorm:"default:0" json:"unreadCount"`                                                                     // 未读消息数（会员侧）
	StaffUnreadCount int        `gorm:"default:0" json:"staffUnreadCount"`                                                                // 未读消息数（客服侧）
	Rating           *uint8     `gorm:"type:tinyint" json:"rating"`                                                                       // 会话评分（1-5星）修复：int -> uint8
	RatingComment    string     `gorm:"size:500" json:"ratingComment"`                                                                    // 评分备注
	ClosedAt         *time.Time `json:"closedAt"`                                                                                         // 关闭时间
	ClosedBy         *uint      `json:"closedBy"`                                                                                         // 关闭人ID
	CreatedAt        time.Time  `gorm:"index:idx_created_at" json:"createdAt"`
	UpdatedAt        time.Time  `json:"updatedAt"`

	// 关联（添加级联和删除策略）
	Member      *User        `gorm:"foreignKey:MemberID;constraint:OnUpdate:CASCADE,OnDelete:RESTRICT" json:"member,omitempty"` // 会员必须存在，不能删除有会话的会员
	Staff       *User        `gorm:"foreignKey:StaffID;constraint:OnUpdate:CASCADE,OnDelete:SET NULL" json:"staff,omitempty"`    // 客服可以为空
	LastMessage *ChatMessage `gorm:"-:migration" json:"lastMessage,omitempty"` // 完全不在数据库中创建关联，避免循环依赖
}

// ChatMessage 聊天消息表
type ChatMessage struct {
	ID          uint       `gorm:"primaryKey" json:"id"`
	SessionID   uint       `gorm:"not null;index:idx_session_id" json:"sessionId"`                                       // 会话ID
	SenderID    *uint      `gorm:"index:idx_sender_id" json:"senderId"`                                               // 发送者ID（可为空，用于外键SET NULL）
	SenderType  string     `gorm:"type:enum('MEMBER','STAFF');not null" json:"senderType"`                               // 发送者类型
	MessageType string     `gorm:"type:enum('TEXT','IMAGE','FILE','SYSTEM');not null;default:'TEXT'" json:"messageType"` // 消息类型
	Content     string     `gorm:"type:text" json:"content"`                                                             // 消息内容（文本内容或文件URL）
	FileURL     string     `gorm:"size:500" json:"fileUrl"`                                                              // 文件URL
	FileName    string     `gorm:"size:200" json:"fileName"`                                                             // 文件名
	FileSize    int64      `json:"fileSize"`                                                                             // 文件大小（字节）
	ImageWidth  int        `json:"imageWidth"`                                                                           // 图片宽度
	ImageHeight int        `json:"imageHeight"`                                                                          // 图片高度
	IsRead      bool       `gorm:"default:false;index:idx_is_read" json:"isRead"`                                        // 是否已读
	ReadAt      *time.Time `json:"readAt"`                                                                               // 阅读时间
	IsRecalled  bool       `gorm:"default:false" json:"isRecalled"`                                                      // 是否撤回
	RecalledAt  *time.Time `json:"recalledAt"`                                                                           // 撤回时间
	CreatedAt   time.Time  `gorm:"index:idx_created_at" json:"createdAt"`
	UpdatedAt   time.Time  `json:"updatedAt"`

	// 关联（添加级联和删除策略）
	Session *ChatSession `gorm:"foreignKey:SessionID;constraint:OnUpdate:CASCADE,OnDelete:CASCADE" json:"session,omitempty"` // 会话删除时级联删除消息
	Sender  *User        `gorm:"foreignKey:SenderID;constraint:OnUpdate:CASCADE,OnDelete:SET NULL" json:"sender,omitempty"`
}

// TypingStatus 正在输入状态（内存中维护，不存数据库）
type TypingStatus struct {
	SessionID uint      `json:"sessionId"`
	UserID    uint      `json:"userId"`
	Username  string    `json:"username"`
	Timestamp time.Time `json:"timestamp"`
}

// ==================== 请求/响应模型 ====================

// CreateSessionReq 创建会话请求
type CreateSessionReq struct {
	Type  string `json:"type" binding:"required,oneof=CUSTOMER_SERVICE COACH_CONSULT"` // 会话类型
	Title string `json:"title"`                                                        // 会话标题（可选）
}

// SessionListReq 会话列表请求
type SessionListReq struct {
	Status   string `form:"status"` // 会话状态过滤
	Type     string `form:"type"`   // 会话类型过滤
	Page     int    `form:"page"`
	PageSize int    `form:"pageSize"`
}

// SessionListResp 会话列表响应
type SessionListResp struct {
	List     []SessionItem `json:"list"`
	Total    int64         `json:"total"`
	Page     int           `json:"page"`
	PageSize int           `json:"pageSize"`
}

// SessionItem 会话列表项
type SessionItem struct {
	ID              uint       `json:"id"`
	Type            string     `json:"type"`
	Status          string     `json:"status"`
	Title           string     `json:"title"`
	MemberID        uint       `json:"memberId"`
	MemberName      string     `json:"memberName"`
	MemberAvatar    string     `json:"memberAvatar"`
	StaffID         *uint      `json:"staffId"`
	StaffName       string     `json:"staffName"`
	StaffAvatar     string     `json:"staffAvatar"`
	LastMessage     string     `json:"lastMessage"`
	LastMessageType string     `json:"lastMessageType"`
	LastMessageAt   *time.Time `json:"lastMessageAt"`
	UnreadCount     int        `json:"unreadCount"`
	CreatedAt       time.Time  `json:"createdAt"`
}

// SendMessageReq 发送消息请求
type SendMessageReq struct {
	SessionID   uint   `json:"sessionId" binding:"required"`
	MessageType string `json:"messageType" binding:"required,oneof=TEXT IMAGE FILE SYSTEM"`
	Content     string `json:"content" binding:"max=5000"`            // 文本内容，最大5000字符
	FileURL     string `json:"fileUrl" binding:"omitempty,url"`       // 文件URL，必须是有效URL
	FileName    string `json:"fileName" binding:"max=255"`            // 文件名，最大255字符
	FileSize    int64  `json:"fileSize" binding:"max=52428800"`       // 文件大小，最大50MB (50*1024*1024)
	ImageWidth  int    `json:"imageWidth" binding:"min=0,max=10000"`  // 图片宽度，0-10000像素
	ImageHeight int    `json:"imageHeight" binding:"min=0,max=10000"` // 图片高度，0-10000像素
}

// MessageListReq 消息列表请求
type MessageListReq struct {
	SessionID uint `form:"sessionId" binding:"required"`
	Page      int  `form:"page"`
	PageSize  int  `form:"pageSize"`
	BeforeID  uint `form:"beforeId"` // 获取指定消息ID之前的消息（用于向上滚动加载）
}

// MessageListResp 消息列表响应
type MessageListResp struct {
	List     []MessageItem `json:"list"`
	Total    int64         `json:"total"`
	Page     int           `json:"page"`
	PageSize int           `json:"pageSize"`
	HasMore  bool          `json:"hasMore"`
}

// MessageItem 消息列表项
type MessageItem struct {
	ID           uint       `json:"id"`
	SessionID    uint       `json:"sessionId"`
	SenderID     uint       `json:"senderId"`
	SenderName   string     `json:"senderName"`
	SenderAvatar string     `json:"senderAvatar"`
	SenderType   string     `json:"senderType"`
	MessageType  string     `json:"messageType"`
	Content      string     `json:"content"`
	FileURL      string     `json:"fileUrl"`
	FileName     string     `json:"fileName"`
	FileSize     int64      `json:"fileSize"`
	ImageWidth   int        `json:"imageWidth"`
	ImageHeight  int        `json:"imageHeight"`
	IsRead       bool       `json:"isRead"`
	IsRecalled   bool       `json:"isRecalled"`
	CreatedAt    time.Time  `json:"createdAt"`
	ReadAt       *time.Time `json:"readAt"`
}

// AssignSessionReq 分配会话请求（管理员功能）
type AssignSessionReq struct {
	StaffID uint `json:"staffId" binding:"required"` // 客服/教练ID
}

// CloseSessionReq 关闭会话请求
type CloseSessionReq struct {
	Rating        *int   `json:"rating"`        // 评分（1-5星）
	RatingComment string `json:"ratingComment"` // 评分备注
}

// MarkReadReq 标记消息已读请求
type MarkReadReq struct {
	MessageIDs []uint `json:"messageIds" binding:"required,min=1"`
}

// WebSocket消息类型定义
const (
	WSMessageTypeNewMessage    = "NEW_MESSAGE"    // 新消息
	WSMessageTypeRead          = "MESSAGE_READ"   // 消息已读
	WSMessageTypeTyping        = "TYPING"         // 正在输入
	WSMessageTypeStopTyping    = "STOP_TYPING"    // 停止输入
	WSMessageTypeSessionUpdate = "SESSION_UPDATE" // 会话更新
	WSMessageTypeError         = "ERROR"          // 错误消息
	WSMessageTypePing          = "PING"           // 心跳ping
	WSMessageTypePong          = "PONG"           // 心跳pong
)

// WSMessage WebSocket消息结构
type WSMessage struct {
	Type      string      `json:"type"`      // 消息类型
	Data      interface{} `json:"data"`      // 消息数据
	Timestamp time.Time   `json:"timestamp"` // 时间戳
}

// WSTypingData 正在输入数据
type WSTypingData struct {
	SessionID uint   `json:"sessionId"`
	UserID    uint   `json:"userId"`
	Username  string `json:"username"`
}

// WSReadData 已读数据
type WSReadData struct {
	SessionID  uint   `json:"sessionId"`
	MessageIDs []uint `json:"messageIds"`
}
